package pl.edu.pw.elka.tinyrepo.gate.server;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.util.Map;

import pl.edu.pw.elka.tinyrepo.common.CatalogContent;
import pl.edu.pw.elka.tinyrepo.common.CatalogContentSerializer;
import pl.edu.pw.elka.tinyrepo.common.HTTPHeaderType;
import pl.edu.pw.elka.tinyrepo.common.Request;
import pl.edu.pw.elka.tinyrepo.common.RequestHandler;
import pl.edu.pw.elka.tinyrepo.common.Response;
import pl.edu.pw.elka.tinyrepo.common.StatusCode;
import pl.edu.pw.elka.tinyrepo.common.exceptions.ContentAlreadyExistException;
import pl.edu.pw.elka.tinyrepo.common.exceptions.WrongPathException;
import pl.edu.pw.elka.tinyrepo.gate.descriptor.CatalogDescriptor;
import pl.edu.pw.elka.tinyrepo.gate.descriptor.Descriptor;
import pl.edu.pw.elka.tinyrepo.gate.descriptor.FileDescriptor;
import pl.edu.pw.elka.tinyrepo.gate.descriptor.RepoDescriptor;


/**
 * @author: Kajot
 */

class MKCOLRequestHandler extends GateRequestHandler {
   
   public MKCOLRequestHandler(RepoDescriptor desc) {
      super(desc);
   }
   
   @Override
   public void run() {
	   
      OutputStream out = null;
      
      try { 

         out = incomming.getOutputStream(); 		// wyjscie do klienta
         String requestPath = request.getPath(); 	// zadany w requescie plik/katalog
         
         CatalogDescriptor d = new CatalogDescriptor(); // utworzenie nowego deskryptora katalogu
         desc.addFileOrDirectoryDesc(d, requestPath);

         Response res = new Response(StatusCode.CREATED); // dla MKCOL jest 201 jako potwierdzenie
         res.write(out);
         System.out.println("Sent response:\n"+res); 
         
      }
      catch (FileNotFoundException e) { // katalog w sciezce nie istnieje
         e.printStackTrace();
         Response rs = new Response(StatusCode.FORBIDDEN);
         rs.write(out);
      }
      catch (ContentAlreadyExistException e) {
         e.printStackTrace();
         Response rs = new Response(StatusCode.CONFLICT);
         rs.write(out);
      }
      catch (WrongPathException e) { // nieprawidlowa sciezka do pliku
         e.printStackTrace();
         Response rs = new Response(StatusCode.FORBIDDEN);
         rs.write(out);
      }
      catch (IOException e) {
         // cos nie tak z polaczeniem, nic nie wysylaj, wyswietl info na serwerze
         e.printStackTrace();
      }
      // socket jest zamykany w klasach DAVServer
   }


   @Override
   public RequestHandler copy() {
      return new MKCOLRequestHandler(desc);
   }
   
   
}
